#pragma once
#include <Windows.h>
#include <string>

namespace CppWinApi::String
{
    class Converter
    {
    public:
        static std::string WStringToGBK(const wchar_t *wstr)
        {
            // 计算所需的缓冲区大小
            int gbkSize = WideCharToMultiByte(
                CP_ACP,          // 目标编码为系统默认 ANSI（GBK）
                0,               // 无特殊标志
                wstr, -1,        // 输入宽字符串（-1 表示自动计算长度）
                nullptr, 0,      // 输出缓冲区为空，仅计算所需大小
                nullptr, nullptr // 不使用默认字符
            );
            if (gbkSize == 0)
            {
                return ""; // 转换失败
            }

            // 分配缓冲区并转换
            std::string gbkStr(gbkSize, 0);
            WideCharToMultiByte(
                CP_ACP, 0, wstr, -1,
                &gbkStr[0], gbkSize, // 输出到预分配缓冲区
                nullptr, nullptr);
            gbkStr.pop_back(); // 移除多余的终止符（可选）
            return gbkStr;
        }

        static bool EndsWith(const std::string &str, const std::string &suffix)
        {
            if (suffix.size() > str.size())
                return false;
            return str.rfind(suffix) == str.size() - suffix.size();
        }

        std::string GbkToUtf8(const char *gbkStr)
        {
            // GBK → Wide Char (UTF-16)
            int wlen = MultiByteToWideChar(CP_ACP, 0, gbkStr, -1, nullptr, 0);
            wchar_t *wstr = new wchar_t[wlen];
            MultiByteToWideChar(CP_ACP, 0, gbkStr, -1, wstr, wlen);

            // Wide Char → UTF-8
            int ulen = WideCharToMultiByte(CP_UTF8, 0, wstr, -1, nullptr, 0, nullptr, nullptr);
            char *utf8_str = new char[ulen];
            WideCharToMultiByte(CP_UTF8, 0, wstr, -1, utf8_str, ulen, nullptr, nullptr);

            std::string result(utf8_str);
            delete[] wstr;
            delete[] utf8_str;
            return result;
        }

        // 将 UTF-8 字符串转换为系统本地 ANSI 编码（如 GBK）
        static std::string Utf8ToGbk(const std::string &utf8)
        {
            int len = MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, NULL, 0);
            std::wstring wstr(len, 0);
            MultiByteToWideChar(CP_UTF8, 0, utf8.c_str(), -1, &wstr[0], len);

            len = WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, NULL, 0, NULL, NULL);
            std::string ansi(len, 0);
            WideCharToMultiByte(CP_ACP, 0, wstr.c_str(), -1, &ansi[0], len, NULL, NULL);
            return ansi;
        }
    };
}